function demodulated_bits = demodulate_qam(symbols, modulation_type)
% demodulate_qam - 对QAM调制的符号进行解调
%
% 输入参数:
%   symbols         - 输入的调制符号
%   modulation_type - 调制类型: 'BPSK', 'QPSK', 'QAM16', 'QAM64'
%
% 输出参数:
%   demodulated_bits - 解调后的比特流

% 获取符号数量
num_symbols = length(symbols);

% 获取每个符号对应的比特数
bits_per_symbol = get_bits_per_symbol(modulation_type);

% 初始化解调后的比特流
demodulated_bits = zeros(num_symbols * bits_per_symbol, 1);

switch upper(modulation_type)
    case 'BPSK'
        % BPSK解调: 实部>0 -> 1, 实部<0 -> 0
        demodulated_bits = real(symbols) > 0;
        
    case 'QPSK'
        % QPSK解调
        % 每个复符号解调为2个比特
        for i = 1:num_symbols
            symbol = symbols(i) * sqrt(2);  % 反归一化
            
            % 确定第一比特 (实部)
            demodulated_bits(2*i-1) = real(symbol) > 0;
            
            % 确定第二比特 (虚部)
            demodulated_bits(2*i) = imag(symbol) > 0;
        end
        
    case 'QAM16'
        % 16QAM解调
        % 每个复符号解调为4个比特
        for i = 1:num_symbols
            symbol = symbols(i) * sqrt(10);  % 反归一化
            
            % 提取实部和虚部
            I = real(symbol);
            Q = imag(symbol);
            
            % 解调第一和第二比特 (实部)
            if I < 0
                demodulated_bits(4*i-3) = 0;  % 第一位
                demodulated_bits(4*i-2) = abs(I) < 2;  % 第二位
            else
                demodulated_bits(4*i-3) = 1;  % 第一位
                demodulated_bits(4*i-2) = abs(I) < 2;  % 第二位
            end
            
            % 解调第三和第四比特 (虚部)
            if Q < 0
                demodulated_bits(4*i-1) = 0;  % 第三位
                demodulated_bits(4*i) = abs(Q) < 2;  % 第四位
            else
                demodulated_bits(4*i-1) = 1;  % 第三位
                demodulated_bits(4*i) = abs(Q) < 2;  % 第四位
            end
        end
        
    case 'QAM64'
        % 64QAM解调
        % 每个复符号解调为6个比特
        for i = 1:num_symbols
            symbol = symbols(i) * sqrt(42);  % 反归一化
            
            % 提取实部和虚部
            I = real(symbol);
            Q = imag(symbol);
            
            % 解调实部对应的3位比特
            I_region = floor((I + 8) / 2);
            I_region = max(0, min(7, I_region));  % 限制在0-7范围
            I_bits = de2bi(I_region, 3, 'left-msb');
            
            % 解调虚部对应的3位比特
            Q_region = floor((Q + 8) / 2);
            Q_region = max(0, min(7, Q_region));  % 限制在0-7范围
            Q_bits = de2bi(Q_region, 3, 'left-msb');
            
            % 存储解调后的比特
            demodulated_bits(6*i-5:6*i-3) = I_bits;
            demodulated_bits(6*i-2:6*i) = Q_bits;
        end
        
    otherwise
        error('不支持的调制类型: %s', modulation_type);
end

end 